/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	app_msg.c
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-05-09
**	Function List： 
**  History:         
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/
#include "app_msg.h"
#include "os_config.h"


/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
#define APP_MSG_MAX_SIZE            200

/*
*********************************************************************************************************
*                                              	结构体定义
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	函数原型声明
*********************************************************************************************************
*/

static app_msg_t *app_msg_alloc(void);

/*
*********************************************************************************************************
*                                              	全局变量定义
*********************************************************************************************************
*/
//app_msg_t 	app_msg_set[APP_MSG_MAX_SIZE];
//OS_MEM    	app_msg_pool;


/*
*********************************************************************************************************
*                                              	模块静态变量定义
*********************************************************************************************************
*/
static struct rt_mempool 	rt_msg_mp;
static uint8_t __attribute__((aligned(4))) rt_msg_mp_buff[RT_MEMPOOL_BYTE_SIZE(APP_MSG_MAX_SIZE,sizeof(app_msg_t))];



/*
*********************************************************************************************************
*                                              	函数定义
*********************************************************************************************************
*/
int app_msg_pool_init(void)
{
	if(RT_EOK != rt_mp_init(&rt_msg_mp,
		"app msg pool",
		rt_msg_mp_buff,
		RT_MEMPOOL_BYTE_SIZE(APP_MSG_MAX_SIZE,sizeof(app_msg_t)),
		sizeof(app_msg_t)
		))
	{
		Critical_Log("app msg mem create failed!\r\n");
	}
	return 0;
}

int app_msg_send(uint32_t event, uint32_t data, struct rt_mailbox* p_mailbox)
{
	/* 申请消息内存 */
	app_msg_t * p_msg = app_msg_alloc();
	if(p_msg == NULL)
	{
		Error_Log("app msg alloc failed!\n");
		return -1;
	}
	/* 赋值 */
	p_msg->event = event;
	p_msg->data = data;
	
	/* 发送至目的任务 */
	if(RT_EOK != rt_mb_send(p_mailbox,(uint32_t)p_msg))
	{
		Error_Log("Send msg faild!\n");
		app_msg_free(p_msg);
		return 0xff;
	}
	return 0;
}
app_msg_t * app_msg_recv(struct rt_mailbox* p_mailbox,rt_int32_t timeout)
{
	app_msg_t * rtn;
	rt_ubase_t rt_base;
	if(RT_EOK != rt_mb_recv(p_mailbox,&rt_base,timeout))
		return NULL;
	rtn = (app_msg_t*) ((uint32_t)rt_base);
	return rtn;
}

static app_msg_t *app_msg_alloc(void)
{
	app_msg_t * p_app_msg = rt_mp_alloc(&rt_msg_mp,RT_WAITING_FOREVER);
	if(NULL==p_app_msg)
	{
//		Critical_Log("app msg mem create failed!\r\n");
		return NULL;
	}
	return p_app_msg;
}


void app_msg_free(app_msg_t *p_msg)
{
	rt_mp_free(p_msg);
}

